/*    file: MultipartBody.h
 *    desc:
 *   
 * created: 2017-10-25
 *  author: chuanjiang.zh@qq.com
 * company: 
 */ 


#if !defined MULTIPARTBODY_H_
#define MULTIPARTBODY_H_

#include "BasicType.h"
#include "StringArray.h"


class MultipartBody
{
public:
	MultipartBody();
	~MultipartBody();

	/// 边界.
	const std::string& boundary() const;

	/**
	 * 添加分段. 可以多次调用.
	 * @param header 头, 必须包含name字段
	 * @param type	内容类型, 可以为空
	 * @param data  数据
	 * @return true 表示成功
	 */
	bool add(const StringMap& header, const std::string& type, const std::string& data);

	/**
	 * 添加表数据分段, 可以多次调用.
	 * @param name	名称
	 * @param data	数据
	 * @return true 表示成功
	 */
	bool addFormData(const std::string& name, const std::string& data);

	/**
	 * 添加文件分段, 可以在 addFormData之间调用.
	 * @param name	名称
	 * @param type	文件类型
	 * @param filepath	文件路径
	 * @return true 表示成功
	 */
	bool addFile(const std::string& name, const std::string& type, const std::string& filepath);

	/**
	 * 生成并返回整个内容
	 * @return
	 */
	std::string get();


protected:
	struct Part
	{
		StringMap	header;
		std::string type;
		std::string data;

		size_t getBytes() const;
	};

	typedef std::vector< Part >	PartArray;


protected:
	std::string makeBoundary();
	
	bool loadFile(const std::string& filepath, std::string& data);

	void makeMessage(const Part& part, std::string& data);

protected:
	
	PartArray	m_parts;
	std::string	m_boundary;


};


#endif //MULTIPARTBODY_H_

